﻿using ShapeManager;
using System.Collections.Generic;
namespace Commands
{
    public class CommandChangeState : ICommand
    {
        // 操作前选定的对象（一个或多个）
        List<DrawObject> listBefore;
        // 操作后的选定对象（一个或多个）
        List<DrawObject> listAfter;

        public CommandChangeState(ShapeList shapeList)
        {
            // 在操作之前保存对象的状态。
            FillList(shapeList, ref listBefore);
        }

        /// <summary> 操作后调用此函数。 </summary>
        public void NewState(ShapeList shapeList)
        {
            // 在操作完成后保持对象的状态。
            FillList(shapeList, ref listAfter);
        }
        public void Undo(ShapeList list)
        {
            // 在操作完成后保持对象的状态。将列表中的所有对象替换为列表“listBefore”中的对象。
            ReplaceObjects(list, listBefore);
        }
        public void Redo(ShapeList list)
        {
            // 将列表中的所有对象替换为 "listAfter" 中的对象。
            ReplaceObjects(list, listAfter);
        }

        /// <summary>  将列表中的所有对象替换为 listAfterReplace 中的对象。将图形列表中的对象替换为 list 中的对象。 </summary>
        private void ReplaceObjects(ShapeList shapeList, List<DrawObject> list)
        {
            for (int i = 0; i < shapeList.Count; i++)
            {
                DrawObject replacement = null;
                foreach (DrawObject obj in list)
                {
                    if (obj.ID == shapeList[i].ID)
                    {
                        replacement = obj;
                        break;
                    }
                }
                if (replacement != null)
                {
                    shapeList.Replace(i, replacement);
                }
            }
        }

        /// <summary> 从选择中填充列表 </summary>
        private void FillList(ShapeList shapeList, ref List<DrawObject> listToFill)
        {
            listToFill = new List<DrawObject>();
            foreach (DrawObject obj in shapeList.Selection)
            {
                listToFill.Add(obj.Clone());
            }
        }
    }
}
